React Aria Button
Button – React Aria
実装
react-spectrum/packages/react-aria-components/src/Button.tsx at main · adobe/react-spectrum · GitHub
マウス、タッチ、キーボード操作するためのアクションが実行できる
インタラクションやアクセシビリティ機能には、考慮すべきブラウザー間の不一致が多数あります
わかりみが深い
@ryo__kts: ボタンUI作るのってそんなに難しいの?ボタンだから簡単でしょ?みたいなこという人いたらこのリンクを投げつけることにしようと思う
https://t.co/AsMCuASILM
こんどからこのリンクを投げつけるようにしよう
ボタンというのは簡単そうにみえて複雑に考えることが多いものだよね
あとunStyleなボタンとかもリンクなのかボタンなのかみたいなとこあるよね
Button – React Aria
code:typescript
import {Link} from 'react-aria-components';
<Link className="react-aria-Button" href="https://adobe.com/" target="_blank">
Adobe
</Link>
React Ariaはこういうふうにリンクボタンコンポーネントを提供している
中身をみにいく
react-spectrum/packages/react-aria-components/src/Link.tsx at main · adobe/react-spectrum · GitHub
hrefがあるかないかでaタグかspanタグにしている
let ElementType: ElementType = props.href && !props.isDisabled ? 'a' : 'span';
propsできになるのは
isPending
これ賢い気がする
よくあるよねこういうUI
ボタンを押したらpending状態にしておき終わったら解除
isPendig中のアクセシビリティ対応もできている
liveAnnounceでやっている
https://github.com/adobe/react-spectrum/blob/main/packages/%40react-aria/live-announcer/src/LiveAnnouncer.tsx
ARIA ライブリージョン - ARIA | MDN
https://gyazo.com/69a4efcf1078e7a98adf7fd982b6805a
各種イベント時にdata属性が用意されていてその時のスタイルングが書ける
これいいね
イベント
Press状態やホバー、Focusなど一通りある
ブラウザのサポートは改善されていますが、React Aria はマウス イベントとタッチ イベントに加えてポインター イベントのフォールバックも実装しています。両方を監視し、マウス イベントの前にタッチ イベントが発生した場合はそれを無視します。こうすることで、どの種類のデバイスがイベントを発生させたかを判断し、ブラウザの遅延を待たずにできるだけ早くイベントを処理できるようになります。
usePressにこれらのイベントがまとまっている
Building a Button Part 2: Hover Interactions – React Spectrum Blog
ホバーについて
useHover – React Aria
ButtonContextが使える
code:ts
import {ButtonContext} from 'react-aria-components';
interface ButtonGroupProps {
children?: React.ReactNode,
isDisabled?: boolean
}
function ButtonGroup({children, isDisabled}: ButtonGroupProps) {
return (
<div style={{display: 'flex', gap: 8}}>
<ButtonContext.Provider value={{isDisabled}}>
{children}
</ButtonContext.Provider>
</div>
);
}
<ButtonGroup isDisabled>
<Button>Save</Button>
<Button>Publish</Button>
</ButtonGroup>
こんな感じでButtonGroupが作れる
useButton – React Aria
useButton
Buttonコンポーネントにはインポートされ使っているけどこのHooksだけインポートしてくれば通常のHTMLに同じような振る舞いを提供できる
そういえばこれに答えを出したい
/ygkn/リンクボタンはなぜ生まれるか
参照
Buttonについて - React Ariaの実装読むぞ